package com.ljx.thread.pollThread07;


import java.util.List;
import java.util.concurrent.*;

/**
 * @author LJX
 * @Description: TODO
 * @Date: 2022/11/2 9:43
 * @Version 1.0
 */

/**
 * Executor 线程池的顶级接口：在该接口中只有一个抽象方法 void execute(Runnable command);
 * 该方法用来执行Runnable类型的业务
 */

/**
 * ExecutorService:他是Executor的子接口，它里面包含了一些对线程池的操作方法
 * void shutdown():关闭线程池，把线程池中的任务执行完成后再关闭
 * List<Runnable> shutdown(); 尝试停止所有正在执行的任务，停止等待任务的处理，并返回等待执行的任务列表。
 * boolean isShutdown(); 判断线程池是否关闭（即是否调用shutdown方法）
 * boolean isTerminated(); 判断线程池是否终止，任务是否执行完毕
 *
 * <T> Future<T> submit(Callable<T> task); 提交callable类型的任务给线程池
 * Future<T> submit(Runnable task); 提交Runnable类型的任务给线程池
 */

/**
 * Executors:他是一个工具类，可以帮助你创建相应的线程池对象
 * 1，newSingleThreadExecutor 创建单一线程：适合只有单线程执行，要求线程按着顺序执行
 * 2，newFixThreadPoll 创建固定长度线程池：适合服务器负载表较重
 * 3，newCachedThreadPool 创建可变线程池；适合短期任务比较重
 * 4，newScheduledThreadPoll 创建延迟执行任务的线程
 */

public class PoolThread01 {
	public static void main(String[] args) {
		// newSingleThreadExecutor 创建单一线程：适合只有单线程执行，要求线程按着顺序执行
		/*	ExecutorService executorService = Executors.newSingleThreadExecutor();
			for (int i = 0; i < 5; i++) {

				executorService.submit(new Runnable() {
					@Override
					public void run() {
						System.out.println(Thread.currentThread().getName());
					}
				});

			}
			executorService.shutdown();
			boolean shutdown = executorService.isShutdown();
			System.out.println(shutdown);*/

		//  2，newFixThreadPoll 创建固定长度线程池：适合服务器负载表较重
		/*ExecutorService executorService = Executors.newFixedThreadPool(3);
		for (int i = 0; i < 10; i++) {
			executorService.submit(new Runnable() {
				@Override
				public void run() {
					System.out.println(Thread.currentThread().getName());
				}
			});

		}
		executorService.shutdownNow();
		boolean terminated = executorService.isTerminated();
		System.out.println(terminated);*/

		// 3，newCachedThreadPool 创建可变线程池；适合短期任务比较重
		/*ExecutorService executorService = Executors.newCachedThreadPool();
		for (int i = 0; i < 3; i++) {
			executorService.submit(new Runnable() {
				@Override
				public void run() {
					System.out.println(Thread.currentThread().getName());
				}
			});
		}
		executorService.shutdown();*/

		// 4，newScheduledThreadPoll 创建延迟执行任务的线程
		// schedule(Runnable command, long delay, TimeUnit unit);
		// 第一个参数是任务对象，第二是延迟的时间，第三个是时间单位
		/*	ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
			for (int i = 0; i < 5; i++) {
				scheduledExecutorService.schedule(new Runnable() {
					@Override
					public void run() {
						System.out.println(Thread.currentThread().getName());
					}
				},2, TimeUnit.SECONDS);
			}
			scheduledExecutorService.shutdown();*/

	}
}
